perm filename DRIVER.SAI[1,BGB] blob
sn#001237 filedate 1972-10-22 generic text, type T, neo UTF8
00100 ENTRY COURSE,DRIVE,INITIAL;
00200 BEGIN "ROVER"
00300
00400 INTERNAL REAL ARRAY MCL,MVL,EVL,ECL[1:4,1:3];
00500 INTERNAL REAL PAN,TILT,WHEELS,
00600 AARCX, AARCY, AARCZ,
00700 BARCX, BARCY, BARCZ,
00800 COTX, COTY, COTZ;
00900
01000 DEFINE α="COMMENT";
01050 REQUIRE "SAITRG[SYS,BGB]" LOAD_MODULE;
01100 EXTERNAL REAL PROCEDURE SIN(REAL X);
01200 EXTERNAL REAL PROCEDURE COS(REAL X);
01300 EXTERNAL REAL PROCEDURE ASIN(REAL X);
01400 EXTERNAL REAL PROCEDURE ACOS(REAL X);
01500 EXTERNAL REAL PROCEDURE SQRT(REAL X);
01600
01700 REAL ARRAY C[1:4,1:3]; α CAMERA LOCUS IN VEHICLE COORDINATES;
01800 REAL CP,SP,CT,ST, α COS & SIN OF PAN & TILT;
01900 ∂Z, α VERTICAL DISPLACEMENT QUANTA;
02000 CCC,SSS, α COS & SIN OF TURN QUANTA;
02100 CCW, α COUNTER CLOCKWISE SIGN;
02200 R, α RADIUS OF TURN;
02225 SPEED, α IN FEET PER SECOND;
02237 TIMDEL, α QUANTUM OF RUNTIME FOR DRIVING;
02250 TOLENS,TOPIVOT,TODECK,CARTLENGTH; α CART'S PHYSICAL DIMENSIONS;
02300 INTEGER I,N;
02400
02500 PROCEDURE TTYARRY(STRING S;REAL ARRAY A);
02600 BEGIN
02700 INTEGER I,J;
02800 OUTSTR(13&10&S&13&10);
02900 FOR I←1 STEP 1 UNTIL 4 DO BEGIN
03000 FOR J←1 STEP 1 UNTIL 3 DO
03100 OUTSTR(" "&CVG(A[I,J]) );
03200 OUTSTR(13&10) END;
03300 END;
00100 α COMPUTE THE CAMERA LOCUS IN VEHICLE COORDINATES;
00200 PROCEDURE SUBCVC;
00300 BEGIN
00400 REAL CP,SP,CT,ST; α COS & SIN OF PAN & TILT;
00500 CP ← COS(PAN);
00600 SP ← SIN(PAN);
00700 CT ← COS(TILT);
00800 ST ← SIN(TILT);
00900 C[1,1]←CP; C[1,2]←SP; C[1,3]←0;
01000 C[2,1]←CT*SP; C[2,2]←-CT*CP; C[2,3]←-ST;
01100 C[3,1]←-ST*SP; C[3,2]←ST*CP; C[3,3]←-CT;
01300 C[4,1]←TOLENS*ST*SP; C[4,2]←-TOLENS*ST*CP; C[4,3]←TOLENS*CT+TOPIVOT;
01400 END;
01500
01600 α COMPUTE THE VEHICLE LOCUS IN CAMERA COORDINATES;
01700 PROCEDURE SUBVCC;
01800 BEGIN
01900 REAL X,Y,Z;
02000 INTEGER I;
02100 SUBCVC;
02200 C[2,1] ↔ C[1,2];
02300 C[3,1] ↔ C[1,3];
02400 C[3,2] ↔ C[2,3];
02500 X ← -C[4,1];
02600 Y ← -C[4,2];
02700 Z ← -C[4,3];
02800 FOR I←1 STEP 1 UNTIL 3 DO C[4,I]←X*C[1,I] + Y*C[2,I] + Z*C[3,I];
02900 END;
03000
03100 α ROTATE THEN TRANSLATE C BY FRAME X INTO Y;
03200 PROCEDURE ROTTRAN (REAL ARRAY Y,X);
03300 BEGIN
03400 INTEGER I,J;
03500 FOR I←1 STEP 1 UNTIL 4 DO α ITH ROW OF C;
03600 FOR J←1 STEP 1 UNTIL 3 DO α JTH COL OF X;
03700 Y[I,J] ← C[I,1]*X[1,J] + C[I,2]*X[2,J] + C[I,3]*X[3,J];
03800 FOR J←1 STEP 1 UNTIL 3 DO
03900 Y[4,J] ← Y[4,J] + X[4,J];
04000 END;
04100
04200 PROCEDURE VEHICLE_TO_CAMERA(REAL ARRAY VEHICLE,CAMERA);
04300 BEGIN
04400 SUBCVC;
04500 ROTTRAN(CAMERA,VEHICLE);
04600 END;
04700
04800 PROCEDURE CAMERA_TO_VEHICLE(REAL ARRAY CAMERA,VEHICLE);
04900 BEGIN
05000 SUBVCC;
05100 ROTTRAN(VEHICLE,CAMERA);
05200 END;
00100 α PLACE CART'S MVL AT POINT A FACING ALONG THE COURSE;
00200 INTERNAL PROCEDURE INITIAL;
00300 BEGIN
00301 TOLENS ← 10/12;
00302 TOPIVOT ← 23/12;
00303 TODECK ← 27/12;
00304 CARTLENGTH← 3;
00400 MVL[4,1] ← AARCX;
00500 MVL[4,2] ← AARCY;
00600 MVL[4,3] ← AARCZ + TODECK;
00700 MVL[2,2] ← MVL[1,1] ← CCW*(AARCX - COTX)/R ;
00800 MVL[2,1] ←-(MVL[1,2] ← CCW*(AARCY - COTY)/R);
00900 MVL[1,3] ← MVL[2,3] ← MVL[3,1] ← MVL[3,2] ← 0;
01000 MVL[3,3] ← 1;
01100 PAN ← WHEELS ← CCW*ASIN(CARTLENGTH/(2*R));
01200 VEHICLE_TO_CAMERA(MVL,MCL);
01410 ARRBLT(EVL[1,1],MVL[1,1],12);
01420 VEHICLE_TO_CAMERA(EVL,ECL);
01700 END;
00100 INTERNAL PROCEDURE COURSE;
00200 BEGIN
00300 REAL AX,AY,BX,BY,RR,PHIMAX,ARCLENGTH,PHIDELTA;
00400 I ← 0;
00450 SPEED ← 1;
00475 TIMDEL ← 1;
00500 AX ← AARCX - COTX;
00600 AY ← AARCY - COTY;
00700 BX ← BARCX - COTX;
00800 BY ← BARCY - COTY;
00900 RR ← AX↑2 + AY↑2;
01000 R ← SQRT(RR);
01100 PHIMAX ← ACOS((AX*BX + AY*BY)/RR);
01200 ARCLENGTH ← R*PHIMAX;
01300 N ← ARCLENGTH / (SPEED*TIMDEL);
01400 PHIDELTA ← PHIMAX/N;
01500 ∂Z ← (BARCZ - AARCZ)/N;
01600 CCW ← (IF(AX*BY - BX*AY)>0 THEN 1 ELSE -1);
01700 CCC ← COS(PHIDELTA);
01800 SSS ← CCW*SIN(PHIDELTA);
01900 END;
00100 α Ok now, let's attempt to drive the motherfucking cart from the last known
00200 Measured Vehicle Locus to an Estimated Vehicle Locus along the course;
00300 PROCEDURE SUBDRIVE;
00400 BEGIN
00500 REAL XX,YY,RX,RY;
00600 XX ← MVL[4,1] - COTX;
00700 YY ← MVL[4,2] - COTY;
00800 EVL[4,3] ← MVL[4,3] + ∂Z;
00900 RX ← CCC*XX - SSS*YY;
01000 RY ← SSS*XX + CCC*YY;
01100 EVL[4,1] ← COTX + RX;
01200 EVL[4,2] ← COTY + RY;
01300 EVL[2,2] ← EVL[1,1] ← CCW*RX/R;
01400 EVL[2,1] ← -(EVL[1,2] ← CCW*RY/R);
01500 END;
01600
01700 INTERNAL BOOLEAN PROCEDURE DRIVE;
01800 BEGIN
01900 IF(I←I+1)>N THEN RETURN(FALSE);
02000 CAMERA_TO_VEHICLE(MCL,MVL);
02100 SUBDRIVE;
02200 VEHICLE_TO_CAMERA(EVL,ECL);
02350 ARRBLT(MCL[1,1],ECL[1,1],12); α PERFECT VISION;
02351 RETURN(TRUE);
02400 END;
02500
02600 END